diff options
Diffstat (limited to 'app/[lng]/evcp/(evcp)/rfq')
| -rw-r--r-- | app/[lng]/evcp/(evcp)/rfq/[id]/cbe/page.tsx | 26 | ||||
| -rw-r--r-- | app/[lng]/evcp/(evcp)/rfq/[id]/layout.tsx | 33 | ||||
| -rw-r--r-- | app/[lng]/evcp/(evcp)/rfq/[id]/page.tsx | 2 | ||||
| -rw-r--r-- | app/[lng]/evcp/(evcp)/rfq/[id]/tbe/page.tsx | 2 |
4 files changed, 37 insertions, 26 deletions
diff --git a/app/[lng]/evcp/(evcp)/rfq/[id]/cbe/page.tsx b/app/[lng]/evcp/(evcp)/rfq/[id]/cbe/page.tsx index bc32641f..fb288a98 100644 --- a/app/[lng]/evcp/(evcp)/rfq/[id]/cbe/page.tsx +++ b/app/[lng]/evcp/(evcp)/rfq/[id]/cbe/page.tsx @@ -1,7 +1,9 @@ import { Separator } from "@/components/ui/separator" import { type SearchParams } from "@/types/table" import { getValidFilters } from "@/lib/data-table" -import { searchParamsTBECache } from "@/lib/rfqs/validations" +import { searchParamsCBECache } from "@/lib/rfqs/validations" +import { getCBE } from "@/lib/rfqs/service" +import { CbeTable } from "@/lib/rfqs/cbe-table/cbe-table" interface IndexPageProps { // Next.js 13 App Router에서 기본으로 주어지는 객체들 @@ -22,31 +24,31 @@ export default async function RfqCBEPage(props: IndexPageProps) { // 2) SearchParams 파싱 (Zod) // - "filters", "page", "perPage", "sort" 등 contact 전용 컬럼 const searchParams = await props.searchParams - const search = searchParamsTBECache.parse(searchParams) + const search = searchParamsCBECache.parse(searchParams) const validFilters = getValidFilters(search.filters) - // const promises = Promise.all([ - // getCBE({ - // ...search, - // filters: validFilters, - // }, - // idAsNumber) - // ]) + const promises = Promise.all([ + getCBE({ + ...search, + filters: validFilters, + }, + idAsNumber) + ]) // 4) 렌더링 return ( <div className="space-y-6"> <div> <h3 className="text-lg font-medium"> - Technical Bid Evaluation + Commercial Bid Evaluation </h3> <p className="text-sm text-muted-foreground"> - 초대된 벤더에게 CBE를 보낼 수 있습니다. <br/>"발행하기" 버튼을 통해 CBE를 전송하면 CBE 내용이 메일로 전달되고 eVCP에도 벤더가 입력할 수 있게 자동 생성됩니다. + 초대된 협력업체에게 CBE를 보낼 수 있습니다. <br />"발행하기" 버튼을 통해 CBE를 전송하면 CBE 내용이 메일로 전달되고 eVCP에도 협력업체가 입력할 수 있게 자동 생성됩니다. </p> </div> <Separator /> <div> - + <CbeTable promises={promises} rfqId={idAsNumber} /> </div> </div> ) diff --git a/app/[lng]/evcp/(evcp)/rfq/[id]/layout.tsx b/app/[lng]/evcp/(evcp)/rfq/[id]/layout.tsx index 2aac90eb..9a03efa4 100644 --- a/app/[lng]/evcp/(evcp)/rfq/[id]/layout.tsx +++ b/app/[lng]/evcp/(evcp)/rfq/[id]/layout.tsx @@ -1,11 +1,12 @@ import { Metadata } from "next" - +import Link from "next/link" import { Separator } from "@/components/ui/separator" import { SidebarNav } from "@/components/layout/sidebar-nav" -import { findVendorById } from "@/lib/vendors/service" // 가정: 여기에 findVendorById가 있다고 가정 -import { Rfq, RfqWithItems } from "@/db/schema/rfq" +import { RfqViewWithItems } from "@/db/schema/rfq" import { findRfqById } from "@/lib/rfqs/service" import { formatDate } from "@/lib/utils" +import { Button } from "@/components/ui/button" +import { ArrowLeft } from "lucide-react" export const metadata: Metadata = { title: "Vendor Detail", @@ -25,8 +26,8 @@ export default async function RfqLayout({ const id = resolvedParams.id const idAsNumber = Number(id) - // 2) DB에서 해당 벤더 정보 조회 - const rfq: RfqWithItems | null = await findRfqById(idAsNumber) + // 2) DB에서 해당 협력업체 정보 조회 + const rfq: RfqViewWithItems | null = await findRfqById(idAsNumber) // 3) 사이드바 메뉴 const sidebarNavItems = [ @@ -50,11 +51,19 @@ export default async function RfqLayout({ <div className="container py-6"> <section className="overflow-hidden rounded-[0.5rem] border bg-background shadow"> <div className="hidden space-y-6 p-10 pb-16 md:block"> + <div className="flex items-center justify-end mb-4"> + <Link href={`/${lng}/evcp/rfq`} passHref> + <Button variant="ghost" className="flex items-center text-primary hover:text-primary/80 transition-colors p-0 h-auto"> + <ArrowLeft className="mr-1 h-4 w-4" /> + <span>RFQ 목록으로 돌아가기</span> + </Button> + </Link> + </div> <div className="space-y-0.5"> - {/* 4) 벤더 정보가 있으면 코드 + 이름 + "상세 정보" 표기 */} + {/* 4) 협력업체 정보가 있으면 코드 + 이름 + "상세 정보" 표기 */} <h2 className="text-2xl font-bold tracking-tight"> {rfq - ? `${rfq.rfqCode ?? ""} 관리` + ? `${rfq.projectCode ?? ""} ${rfq.rfqCode ?? ""} 관리` : "Loading RFQ..."} </h2> @@ -63,15 +72,15 @@ export default async function RfqLayout({ ? `${rfq.description ?? ""} ${rfq.lines.map(line => line.itemCode).join(", ")}` : ""} </p> - <h3>Due Date:{ rfq && <strong>{formatDate(rfq?.dueDate)}</strong>}</h3> + <h3>Due Date:{rfq && rfq?.dueDate && <strong>{formatDate(rfq?.dueDate)}</strong>}</h3> </div> <Separator className="my-6" /> <div className="flex flex-col space-y-8 lg:flex-row lg:space-x-12 lg:space-y-0"> - <aside className="-mx-4 lg:w-1/6"> - <SidebarNav items={sidebarNavItems} /> + <aside className="lg:w-64 flex-shrink-0"> + <SidebarNav items={sidebarNavItems} /> </aside> - <div className="flex-1">{children}</div> - </div> + <div className="lg:w-[calc(100%-16rem)] overflow-auto">{children}</div> + </div> </div> </section> </div> diff --git a/app/[lng]/evcp/(evcp)/rfq/[id]/page.tsx b/app/[lng]/evcp/(evcp)/rfq/[id]/page.tsx index 026ca5ac..1a9f4b18 100644 --- a/app/[lng]/evcp/(evcp)/rfq/[id]/page.tsx +++ b/app/[lng]/evcp/(evcp)/rfq/[id]/page.tsx @@ -43,7 +43,7 @@ export default async function RfqPage(props: IndexPageProps) { Vendors </h3> <p className="text-sm text-muted-foreground"> - 등록된 벤더 중에서 이 RFQ 아이템에 매칭되는 업체를 보여줍니다. <br/>"발행하기" 버튼을 통해 RFQ를 전송하면 첨부파일과 함께 RFQ 내용이 메일로 전달되고 eVCP에도 벤더가 입력할 수 있게 자동 생성됩니다. + 등록된 협력업체 중에서 이 RFQ 아이템에 매칭되는 업체를 보여줍니다. <br/>"발행하기" 버튼을 통해 RFQ를 전송하면 첨부파일과 함께 RFQ 내용이 메일로 전달되고 eVCP에도 협력업체가 입력할 수 있게 자동 생성됩니다. </p> </div> <Separator /> diff --git a/app/[lng]/evcp/(evcp)/rfq/[id]/tbe/page.tsx b/app/[lng]/evcp/(evcp)/rfq/[id]/tbe/page.tsx index 15c5d93c..76eea302 100644 --- a/app/[lng]/evcp/(evcp)/rfq/[id]/tbe/page.tsx +++ b/app/[lng]/evcp/(evcp)/rfq/[id]/tbe/page.tsx @@ -43,7 +43,7 @@ export default async function RfqTBEPage(props: IndexPageProps) { Technical Bid Evaluation </h3> <p className="text-sm text-muted-foreground"> - 초대된 벤더에게 TBE를 보낼 수 있습니다. <br/>"발행하기" 버튼을 통해 TBE를 전송하면 첨부파일과 함께 TBE 내용이 메일로 전달되고 eVCP에도 벤더가 입력할 수 있게 자동 생성됩니다. + 초대된 협력업체에게 TBE를 보낼 수 있습니다. <br/>"발행하기" 버튼을 통해 TBE를 전송하면 첨부파일과 함께 TBE 내용이 메일로 전달되고 eVCP에도 협력업체가 입력할 수 있게 자동 생성됩니다. </p> </div> <Separator /> |
